package com.t360.numberencoding;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;

/**
 * Class for modelling the mapping between digits and letters
 * @author fmanganiello
 *
 */
public class Mapping {
	private Map<Integer, List<Character>> table;
	private static Map<Integer, List<Character>> defaultTable = new HashMap<Integer, List<Character>>();
	private static Mapping defaultMapping;
	
	static {
		ArrayList<Character> list0 = new ArrayList<Character>();
		list0.add('e');
		defaultTable.put(0, list0);
		
		ArrayList<Character> list1 = new ArrayList<Character>();
		list1.add('j');
		list1.add('n');
		list1.add('q');
		defaultTable.put(1, list1);
		
		ArrayList<Character> list2 = new ArrayList<Character>();
		list2.add('r');
		list2.add('w');
		list2.add('x');
		defaultTable.put(2, list2);
		
		ArrayList<Character> list3 = new ArrayList<Character>();
		list3.add('d');
		list3.add('s');
		list3.add('y');
		defaultTable.put(3, list3);
		
		ArrayList<Character> list4 = new ArrayList<Character>();
		list4.add('f');
		list4.add('t');
		defaultTable.put(4, list4);
		
		ArrayList<Character> list5 = new ArrayList<Character>();
		list5.add('a');
		list5.add('m');
		defaultTable.put(5, list5);
		
		ArrayList<Character> list6 = new ArrayList<Character>();
		list6.add('c');
		list6.add('i');
		list6.add('v');
		defaultTable.put(6, list6);
		
		ArrayList<Character> list7 = new ArrayList<Character>();
		list7.add('b');
		list7.add('k');
		list7.add('u');
		defaultTable.put(7, list7);
		
		ArrayList<Character> list8 = new ArrayList<Character>();
		list8.add('l');
		list8.add('o');
		list8.add('p');
		defaultTable.put(8, list8);
		
		ArrayList<Character> list9 = new ArrayList<Character>();
		list9.add('g');
		list9.add('h');
		list9.add('z');
		defaultTable.put(9, list9);
	}
	
	public Mapping(final Map<Integer, List<Character>> table) {
		this.table = table;
	}
	
	public List<Character> get(final int key) {
		return table.get(key);
	}
	
	public synchronized static Mapping getDefaultMapping() {
		if (defaultMapping == null) {
			defaultMapping = new Mapping(defaultTable);
		}
		
		return defaultMapping;
	}
}
